package org.example.common.configs.queue.disruptor;

import com.lmax.disruptor.WorkHandler;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.Objects;
import java.util.function.Consumer;

/**
 * @author weigang
 * @create 2022-07-11 14:27
 */
/**
 * 消费模式，举个例子，假设在电商场景中，每产生一个订单都要发邮件和短信通知买家，如果产生了十个订单
 * 独立消费：要发十封邮件和十条短信，此时，邮件系统和短信系统是各自独立的，他们各自消费这十个订单的事件，也就是说十个事件被消费二十次
 * 共同消费：假设邮件系统处理能力差，为了提升处理能力，部署了两台邮件服务器，因此是这两台邮件服务器共同处理十个订单事件，合起来一共发送了十封邮件
 * <p>
 * 共同消费模式，实现WorkHandler
 * 独立消费模式，实现EventHandler
 */
@AllArgsConstructor
@Slf4j
public class DisruptorEventHandler implements WorkHandler<DisruptorEvent> {
    /*
    * 事件消费处理器
    * disruptor会回调此处理器的方法
    * 共同消费模式 : Disruptor队列中同一个事件可以有多个消费者,消费者之间既可以并行处理,也可以形成依赖图相互依赖,按照先后次序进行处理
    * */
    private Consumer<Object> eventConsumer;
    @Override
    public void onEvent(DisruptorEvent event) throws Exception {
        if (Objects.isNull(event.getEvent())) {
            return;
        }

        // Disruptor比较坑，生产者发布事件没有超时时间，如果消费者很慢，那么会永久阻塞业务流程
        // 使用Consumer接口，消费event事件
        eventConsumer.accept(event.getEvent());
    }
}
